home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 007 / withbe.pqs / withbe.pas
Pascal/Delphi Source File  |  1985-08-03  |  6KB  |  218 lines

  1. program withbench;
  2.  
  3. { program to benchmark the WITH statement
  4.   IBM PC specific.
  5.   The timer routines would have to be replaced for a different machine.
  6. }
  7.  
  8. const NumIter = 1000;  { actual number is NumIter ** 2 }
  9.  
  10. type TimerType = record
  11.                    low, high : integer
  12.                  end;
  13.  
  14. var StartTime, EndTime : TimerType;
  15.     LoopOverhead       : Real;
  16.     Ix1, Ix2           : integer;
  17.     CTime              : Real;
  18.     n                  : integer;
  19.  
  20. {----- variables referenced used in the benchmark itself }
  21.  
  22. type AType = record
  23.                A1, A2 : integer
  24.              end;
  25.      BType = array [1..10] of record
  26.                                 B1, B2 : integer
  27.                               end;
  28.  
  29. var AData : AType;
  30.     BData : BType;
  31.  
  32. var APtr : ^AType;
  33.     BPtr : ^BType;
  34.  
  35. procedure GetTime(var t : TimerType);
  36. { NOTE: The techniqe used by this routine is quick, but totally incompatible }
  37.   var BiosTimer : TimerType absolute $40:$6C;
  38.   begin
  39.     Inline($FA);  { disable interrupts }
  40.     t := BiosTimer;
  41.     Inline($FB)   { enable interrupts }
  42.   end;
  43.  
  44. function CalcElapsed : real;
  45.  
  46.   function TimerToReal(t : TimerType) : Real;
  47.     const TimerUnit = 18.2;
  48.           RealAdj   = 65536.0;
  49.     var r : real;
  50.     begin
  51.       r := (t.high * RealAdj) + t.low;
  52.       if t.low < 0 then r := r + RealAdj;
  53.       TimerToReal := r / TimerUnit
  54.     end;
  55.  
  56.   begin   { CalcElapsed }
  57.     CalcElapsed := TimerToReal(EndTime) - TimerToReal(StartTime)
  58.   end;
  59.  
  60. function CalcTime : Real;
  61.   begin
  62.     CalcTime := (CalcElapsed - LoopOverhead) / (Int(NumIter) * Int(NumIter))
  63.   end;
  64.  
  65. begin
  66.   ClrScr;
  67.   writeln('Benchmark: WITH Statement');
  68.   writeln;
  69.  
  70. { calculate the loop overhead }
  71.   GetTime(StartTime);
  72.   for Ix1 := 1 to NumIter do
  73.     for Ix2 := 1 to NumIter do begin
  74.     end;
  75.   GetTime(EndTime);
  76.   LoopOverhead := CalcElapsed;
  77.   writeln('Loop overhead = ', LoopOverhead:18:9);
  78.  
  79. { simple assignment, using WITH }
  80.   GetTime(StartTime);
  81.   for Ix1 := 1 to NumIter do
  82.     for Ix2 := 1 to NumIter do begin
  83.       with AData do begin
  84.         A1 := 1
  85.       end
  86.     end;
  87.   GetTime(EndTime);
  88.   CTime := CalcTime;
  89.   writeln('WITH AData DO A1 := 1 ', CTime:18:9);
  90.  
  91. { like above, but do not count the overhead for the WITH statement itself }
  92.   GetTime(StartTime);
  93.   with AData do
  94.     for Ix1 := 1 to NumIter do
  95.       for Ix2 := 1 to NumIter do begin
  96.         A1 := 1
  97.       end;
  98.   GetTime(EndTime);
  99.   CTime := CalcTime;
  100.   writeln('  A1 := 1             ', CTime:18:9);
  101.  
  102. { simple assignment, no WITH }
  103.   GetTime(StartTime);
  104.   for Ix1 := 1 to NumIter do
  105.     for Ix2 := 1 to NumIter do begin
  106.       AData.A1 := 1
  107.     end;
  108.   GetTime(EndTime);
  109.   CTime := CalcTime;
  110.   writeln('AData.A1 := 1         ', CTime:18:9);
  111.  
  112. { using WITH, data on heap }
  113.   New(APtr);
  114.   GetTime(StartTime);
  115.   for Ix1 := 1 to NumIter do
  116.     for Ix2 := 1 to NumIter do begin
  117.       with APtr^ do begin
  118.         A1 := 1
  119.       end
  120.     end;
  121.   GetTime(EndTime);
  122.   CTime := CalcTime;
  123.   writeln('WITH APtr^ DO A1 := 1 ', CTime:18:9);
  124.  
  125. { like above, but don't count the WITH statement itself }
  126.   with APtr^ do begin
  127.     GetTime(StartTime);
  128.     for Ix1 := 1 to NumIter do
  129.       for Ix2 := 1 to NumIter do begin
  130.         A1 := 1
  131.       end
  132.   end;
  133.   GetTime(EndTime);
  134.   CTime := CalcTime;
  135.   writeln('  A1 := 1             ', CTime:18:9);
  136.  
  137. { no WITH, data on heap }
  138.   GetTime(StartTime);
  139.   for Ix1 := 1 to NumIter do
  140.     for Ix2 := 1 to NumIter do begin
  141.       APtr^.A1 := 1
  142.     end;
  143.   GetTime(EndTime);
  144.   CTime := CalcTime;
  145.   writeln('APtr^.A1 := 1         ', CTime:18:9);
  146.  
  147. { array element assignment, using WITH }
  148.   n := 1;
  149.   GetTime(StartTime);
  150.   for Ix1 := 1 to NumIter do
  151.     for Ix2 := 1 to NumIter do begin
  152.       with BData[n] do begin
  153.         B1 := 1
  154.       end
  155.     end;
  156.   GetTime(EndTime);
  157.   CTime := CalcTime;
  158.   writeln('WITH BData[n] DO B1 := 1 ', CTime:18:9);
  159.  
  160. { like above, but don't count the WITH statement }
  161.   with BData[n] do begin
  162.     GetTime(StartTime);
  163.     for Ix1 := 1 to NumIter do
  164.       for Ix2 := 1 to NumIter do begin
  165.         B1 := 1
  166.       end
  167.   end;
  168.   GetTime(EndTime);
  169.   CTime := CalcTime;
  170.   writeln('  B1 := 1                ', CTime:18:9);
  171.  
  172. { array element assignment, no WITH }
  173.   GetTime(StartTime);
  174.   for Ix1 := 1 to NumIter do
  175.     for Ix2 := 1 to NumIter do begin
  176.       BData[n].B1 := 1
  177.     end;
  178.   GetTime(EndTime);
  179.   CTime := CalcTime;
  180.   writeln('BData[n].B1 := 1         ', CTime:18:9);
  181.  
  182. { array element assignment using WITH, data on heap }
  183.   New(BPtr);
  184.   GetTime(StartTime);
  185.   for Ix1 := 1 to NumIter do
  186.     for Ix2 := 1 to NumIter do begin
  187.       with BPtr^[n] do begin
  188.         B1 := 1
  189.       end
  190.     end;
  191.   GetTime(EndTime);
  192.   CTime := CalcTime;
  193.   writeln('WITH BPtr^[n] DO B1 := 1 ', CTime:18:9);
  194.  
  195. { like about, but dont count the WITH statement }
  196.   with BPtr^[n] do begin
  197.     GetTime(StartTime);
  198.     for Ix1 := 1 to NumIter do
  199.       for Ix2 := 1 to NumIter do begin
  200.         B1 := 1
  201.       end
  202.   end;
  203.   GetTime(EndTime);
  204.   CTime := CalcTime;
  205.   writeln('  B1 := 1                ', CTime:18:9);
  206.  
  207. { array element assignment, no WITH, data on heap }
  208.   GetTime(StartTime);
  209.   for Ix1 := 1 to NumIter do
  210.     for Ix2 := 1 to NumIter do begin
  211.       BPtr^[n].B1 := 1
  212.     end;
  213.   GetTime(EndTime);
  214.   CTime := CalcTime;
  215.   writeln('BPtr^[n].B1 := 1         ', CTime:18:9);
  216.  
  217. end.
  218.